<?php

class Func
{
	var $error = "";
	
	var $charError = false;
	var $requiredError = false;
	
	function getTimestamp() 
	{
		list($day,$month,$year) = explode("/",date("d/m/Y"));
		return mktime ( 0, 0, 0, intval($month), intval($day), intval($year) );
	}

	function dateAdd($date, $dayDiff) 
	{
		list($day,$month,$year) = explode("/",$date);
		$tsDate = mktime ( 0, 0, 0, intval($month), intval($day), intval($year) );
		$tsDay = $dayDiff * (60 * 60 * 24);
		$tsDate += $tsDay;
		return date("d/m/Y",$tsDate);
	}

	function nvl(&$value, $rep = "", $cmp = "NULL" ) 
	{
		if ( $value == $cmp )
			return $rep;
		else
			return $value;
	}

	function dateInto($date, $dateStart, $dateEnd) 
	{
		if ( $dateStart == "" ) $dateStart = "31/12/2037";
		if ( $dateEnd   == "" ) $dateEnd = "31/12/2037";
	
		list($day,$month,$year) 	= explode("/",$date);
		list($day1,$month1,$year1) 	= explode("/",$dateStart);
		list($day2,$month2,$year2) 	= explode("/",$dateEnd);
	
		$tsDate 	= mktime ( 0, 0, 0, intval($month), intval($day), intval($year) );
		$tsDate1 	= mktime ( 0, 0, 0, intval($month1), intval($day1), intval($year1) );
		$tsDate2 	= mktime ( 0, 0, 0, intval($month2), intval($day2), intval($year2) );
		
	    //echo "<br>".$dateStart." <= ".$date." <= ".$dateEnd."<br>";
	    //echo "<br>".$tsDate1." <= ".$tsDate." <= ".$tsDate2."<br>";
	    
		if ( $tsDate1 <= $tsDate && $tsDate <= $tsDate2 )
			return true;
		else
			return false;
	}
	
	function convertType($type, $value)
	{
		switch( $type )
		{
			case "date":
				$tmp = split("-", $value);
				return $tmp[2]."/".$tmp[1]."/".$tmp[0];
				break;
		}
	}

	function makeSql($sql, $param)
	{
		foreach($param as $val)
		{
			$pos = strpos($sql, "?");
			$type = substr($sql, $pos, 2);
			switch( $type )
			{
				case "?s":
					$val = str_replace("'", "\'", $val);
					$sql = substr($sql, 0, $pos)."'$val'".substr($sql, $pos + 2);
					break;

				case "?n":
					$sql = substr($sql, 0, $pos).$val.substr($sql, $pos + 2);
					break;

				case "?d":
					$sql = substr($sql, 0, $pos)."'$val'".substr($sql, $pos + 2);
					break;
			}
			
		}
		return $sql;
	}

	/**
		
	 */

	function makeAutoSql($type, $table, $data, $fields, $where = array())
	{
		$sql1 = "";
		$sql2 = "";

		while (list(, $tmp) = each ($fields))
		{
			$field = split("=", $tmp);
			$pos = strpos($field[0], "->");
			if ( $pos > 0 )
			{
				$field[2] = substr($field[0], 0, $pos);
				$field[0] = substr($field[0] , $pos + 2);
				$chkField = $field[2];
			}
			else
			{
				$chkField = $field[0];
			}
//print "$chkField<br>";
			reset($data);

			while (list($key, $val) = each ($data))
			{
//print "$key == $chkField <br>";
				if ( $key == $chkField && $val != "" )
				{
					if ( $sql1 != "")
					{
						$sql1.= ",";
						$sql2.= ",";
					}

					if ( $val != "NULL" )
					{
						if ( $field[1] == "?s" )
						{
							$val = str_replace("'", "\'", $val);
							$val = "'".$val."'";
						}
						if ( $field[1] == "?d" )
						{
							$tdate = split("/", $val);
							$val = "'".$tdate[2]."-".$tdate[1]."-".$tdate[0]."'";
						}
						if ( $field[1] == "?t" )
						{
							$val = "'".$val."'";
						}
					}

					if ( $type == "insert" )
					{
						$sql1.= $field[0];
						$sql2.= $val;
					}
					else
					{
						$sql1.= $field[0]."=".$val;
					}

					break;
				} 
			}
		}

		if ( $type == "update" )
		{
			if ( count($where) > 0 )
			{
				$sql2 = "";
				while (list(, $tmp) = each ($where))
				{
					if ( $sql2 != "") $sql2.= " AND ";
					$sql2.= $tmp;
				}				
				$sql2 = "WHERE ".$sql2;
			}
			else
			{
				$sql2 = "";
			}
		}

		if ( $type == "insert" )
			return "INSERT INTO ".$table. " (".$sql1.") VALUES (".$sql2.")"; 
		else
			return "UPDATE ".$table." SET ".$sql1." ".$sql2; 
	}

	function checkError( $err )
	{
		if ( preg_match("/".$err."/i", $this->error) )
			return true;
		else
			return false;
	}
	
	/*
		Es. $_check["required"] = ""
			$_check["char"] = "alphanumeric" "name"
			$_check["charMin"] = 8
			$_check["charMax"] = 10
			$_check["date"] = ""
			$_check["time"] = ""
			$_check["email"] = ""
			checkValue( &$value, &$_check)
	 */
	function checkValue($val, $param=array())
	{
		$this->error = "";
		$ctrlDate = 0;

		if ( !isset($mese[1]) ) {
			$mese[1] = 31;
			$mese[2] = 28;
			$mese[3] = 30;
			$mese[4] = 31;
			$mese[5] = 30;
			$mese[6] = 31;
			$mese[7] = 31;
			$mese[8] = 31;
			$mese[9] = 30;
			$mese[10]= 31;
			$mese[11]= 30;
			$mese[12]= 31;
		}

		// Controlla obbligatorieta
		if ( isset($param["required"]) )
		{
			if ( trim($val) == "" )	
			{
				$this->error .= " required ";
				return true;
			}
		}
		elseif ( $val == "" )
		{
			return false;
		}

		// Controllo caratteri
		if ( isset($param["char"]) )
		{
			$char = "";
			if ( preg_match("/all/i", $param["char"]) )
				$char.="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzèòàùéì =*+#°%&/,'.;:-_<>!?()[]@"."\"";

			if ( preg_match("/protocol/i", $param["char"]) )
				$char.="1234567890ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxy /-";

			if ( preg_match("/letter/i", $param["char"]) )
				$char.="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";

			if ( preg_match("/numeric/i", $param["char"]) )
				$char.="1234567890";

			if ( preg_match("/float/i", $param["char"]) )
				$char.="1234567890,";
				
			if ( preg_match("/currency/i", $param["char"]) || preg_match("/percentage/i", $param["char"]) )
				$char.="1234567890,.";

			if ( preg_match("/name/i", $param["char"]) )
				$char.="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyzèòàùéì1234567890 .'"."\"";

			if ($char != "") 
			{
				$len = strlen($val);
				$len_char = strlen($char);
				while ( $len-- ) 
				{
					$lc = $len_char;
					$str = substr($val, $len, 1);
					$ctrl = true;
					while ( $lc-- ) 
					{
						if ( substr($char,$lc,1) == $str ) 
						{
							$ctrl=false;
							break;
						}
					}
					if ($ctrl) $this->error .= " char ";
				}
			}
		}

		// Caratteri minimi
		if ( isset($param["charMin"]) ) 
			if ( strlen($val) < $param["charMin"] )
				$this->error .= " charMin ";

		// Caratteri massimi
		if ( isset($param["charMax"]) ) 
			if ( strlen($val) > $param["charMax"] )
				$this->error .= " charMax ";

		if ( isset($param["time"]) ) 
		{
			$ctrl_data=0;
			if (preg_match("/^(0[0-9]|1[0-9]|2[0-3])([0-5][0-9])$/",$val)) $ctrl_data++;
	
			if ($ctrl_data > 0) 
			{
				$hh=intval(substr($val, 0, 2));
				$mi=intval(substr($val, 2, 2));
	
				if ($hh > 0 && $hh <= 23) $ctrl_data++;
				if ($mi > 0 && $mi <= 59) $ctrl_data++;
			}
			if ($ctrl_data < 3) $this->error .= " time ";
		}

		if ( isset($param["email"]) ) 
		{
			if (trim($val) != "") 
			{
				$result = eregi("^[_a-z0-9+-]+(\.[_a-z0-9+-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)+$",$val);
				if (!$result) $this->error .= " email ";
			}
		}

		$tmp = array();
		if ( isset($param["currencyInt"]) ) 
		{
			$tmp = split(",", $val);	
			if (strlen( $tmp[0] ) > $param["currencyInt"]) $this->error .= " currencyInt ";
		}

		$tmp = array();
		if ( isset($param["currencyDec"]) ) 
		{
			$tmp = split(",", $val);	
			if (strlen($tmp[1]) > $param["currencyDec"]) $this->error .= " currencyDec ";
		}
	
		if ( isset($param["date"]) ) 
		{
			$dd = intval( substr($val, 0, 2) );
			$mm = intval( substr($val, 3, 2) );
			$yyyy = intval( substr($val, 6, 4) );

			if ( ! preg_match("/^(0[1-9]|[12][[:digit:]]|3[01])\/(0[1-9]|1[012])\/([123456789][[:digit:]]{3})$/", $val) )
				$this->error .= " dateFormat ";
			elseif ( $dd < 1 && $dd > $mese[ $mm ] )
				$this->error .= " dateFormatDay ";
			else
			{
				if ( isset($param["dateMin"]) )
				{
					$dateMinD = intval( substr($param["dateMin"], 0, 2) );
					$dateMinM = intval( substr($param["dateMin"], 3, 2) );
					$dateMinY = intval( substr($param["dateMin"], 6, 4) );
				}
				else
				{
					$dateMinD = 1;
					$dateMinM = 1;
					$dateMinY = 1900;
				}
				
				if ( isset($param["dateMax"]) )
				{
					$dateMinD = intval( substr($param["dateMax"], 0, 2) );
					$dateMinM = intval( substr($param["dateMax"], 3, 2) );
					$dateMinY = intval( substr($param["dateMax"], 6, 4) );
				}
				else
				{
					$dateMaxD = 31;
					$dateMaxM = 12;
					$dateMaxY = 2020;
				}

				if ($mm >= $dateMinM && $mm <= $dateMaxM) $ctrlDate++;
				if ($dd >= $dateMinD && $dd <= $dateMaxD) $ctrlDate++;
				if ($yyyy >= $dateMinY && $yyyy <= $dateMaxY) $ctrlDate++;
				if ( $ctrlDate < 3 ) $this->error .= " dateNoRange ";
			}
		}

		if ( isset( $param["phone"] )  ) 
		{
			$ctrlPhone = 0;
			if (trim($val) != "") 
			{
				/**
				 * Si possono inserire numeri internazionali con prefisso 00 o +
				 */
				if(substr($val,0,2) == "00" || substr($val,0,1) == "+") 
				{
					// numero internazionale con prefisso 00 o +, vengono controllati solo i numeri
					if( ! ereg("^(0{2}|\+{1})(([0-9]*[1-9]+[0-9]*)(-|\.|\/)?)+$", $val) ) 
					{
						$ctrlPhone += 1;
					}
				}
				
				/**
				* Validazione del numero di telefono fisso
				* xxxx/xxxx xxxx/xxxxxxxxx
				* Deve essere composto da prefisso e numero separato da "/" o prefisso e numero
				* attaccati, per consentire solo lo "/" togliere "?" dopo lo slash nella regexp
				* Il prefisso deve iniziare con 0 ed essere di lunghezza non superiore a quattro caratteri
				* La lunghezza del numero senza prefisso va da 4 a 9 caratteri
				* (in modo da consentire di inserire numeri per l'instradamento)
				*/
				// TODO:Integrare il controllo del numero di caratteri consenti (da 4 a 9) all'interno della
				// RegExp che vieta di inserire numeri di telefono composti da soli zeri
				if ( ! preg_match("/^0{1}[1-9]{1}[0-9]{0,2}\/?([0-9]*[1-9]+[0-9]*)$/", $val) || 
						 ! preg_match("/^0{1}[1-9]{1}[0-9]{0,2}\/?[0-9]{4,9}$/", $val) ) 
				{
					//print "fix<br>";
					$ctrlPhone += 1;
				}
			
				/**
				 * Validazione del numero di telefono mobile
				 * xxx/xxxxxx xxx/xxxxxxx
				 * Deve essere composto da prefisso e numero separato da "/" o prefisso e numero
				 * attaccati, per consentire solo lo "/" togliere "?" dopo lo slash nella regexp
				 * Il prefisso deve iniziare con 3 ed essere di lunghezza non superiore a 3 caratteri
				 * La lunghezza del numero senza prefisso è dai 6 ai 7 caratteri
				 * (in modo da consentire di inserire numeri per l'instradamento)
				 * Si possono inserire numeri internazionali con prefisso 00 o +
				 */
				// TODO:Integrare il controllo del numero di caratteri consenti (da 6 a 7) all'interno della
				// RegExp che vieta di inserire numeri di telefono composti da soli zeri
				if ( ! ereg("^3{1}[2-9]{1}[0-9]{1}\/?([0-9]*[1-9]+[0-9]*)$", $val) || 
						 ! ereg("^3{1}[2-9]{1}[0-9]{1}\/?[0-9]{6,7}$", $val) ) 
				{
					//print "mobile<br>";
					$ctrlPhone += 1;
				}
			}
		
			//print ">$val< >$ctrlPhone<<br>";
			if ( $ctrlPhone > 1 ) $this->error .= " phone ";
		}

		if ( $this->error != "" )
			return true;
		else
			return false;
	}
}

?>